﻿//提供绑定指定共享参数到所有类别的的功能

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using RevitProject.REnvironment;
namespace RevitProject.SpaceManager.Factory
{
    public static class ShareFactory
    {

        /// <summary>
        /// 绑定指定的共享参数到所有类别
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="names"></param>
        public static void CreatePara(Document doc, List<string> names)
        {
            var definitionFile = DefinitionInfo.GetDefinitionFile(doc);

            if (definitionFile != null)
            {
                var definitionGroups = definitionFile.Groups;
                var group = definitionFile.Groups.get_Item("空间类别") ?? definitionGroups.Create("空间类别");

                // 建议将 ParameterBindings 获取放到循环外，如果性能不是问题的话
                // var proMap = doc.ParameterBindings;

                foreach (var name in names)
                {
                    // 1. 获取或创建共享参数定义 (同之前的建议)
                    ExternalDefinition definition = group.Definitions.get_Item(name) as ExternalDefinition;
                    if (definition == null)
                    {
                        var externalDefinitionCreationOptions = new ExternalDefinitionCreationOptions(name, SpecTypeId.String.Text);
                        definition = group.Definitions.Create(externalDefinitionCreationOptions) as ExternalDefinition;
                        if (definition == null)
                        {
                            // Log error or handle failure
                            continue;
                        }
                    }

                    // 2. 检查该定义是否已绑定到项目 (同之前的建议)
                    // 注意：如果真的要绑定到“所有”类别，可能需要更复杂的检查，
                    // 因为 ParameterBindings.Contains 只检查定义是否存在，不检查绑定到了哪些类别。
                    // 但为了简化，我們先假设如果定义存在就不重复绑定。
                    // 如果需要确保绑定到所有类别（即使之前只绑定了部分），逻辑会更复杂。
                    if (!doc.ParameterBindings.Contains(definition))
                    {
                        // 3. 创建 CategorySet 并填充所有允许绑定的类别
                        CategorySet categorySet = new CategorySet();
                        Categories allCategories = doc.Settings.Categories;

                        foreach (Category category in allCategories)
                        {
                            // 检查类别是否允许绑定共享参数
                            if (category.AllowsBoundParameters)
                            {
                                // 可选：进一步筛选，例如只选择模型类别
                                // if (category.CategoryType == CategoryType.Model)
                                // {
                                //     categorySet.Insert(category);
                                // }

                                // 或者不筛选类型，只要允许就添加
                                categorySet.Insert(category);
                            }
                        }

                        if (categorySet.IsEmpty)
                        {
                            // Log error: No categories found that allow binding
                            continue;
                        }

                        // 4. 创建绑定 (Instance Binding)
                        // 注意：绑定到这么多类别，InstanceBinding 通常比 TypeBinding 更常见
                        Binding binding = doc.Application.Create.NewInstanceBinding(categorySet);

                        // 5. 插入绑定
                        // 同样需要事务 (Transaction) 包裹此方法调用
                        if (doc.ParameterBindings.Insert(definition, binding, GroupTypeId.Text))
                        {
                            // Success
                        }
                        else
                        {
                            // Failure
                        }
                    }
                    // else // Definition already bound, skip or log
                }
            }
        }


        /// <summary>
        /// 获取地址的方法
        /// </summary>
        /// <returns></returns>
        public static string GetShareParaPath()
        {
            var locationpath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            // 这里可以根据需要返回不同的路径
            var sharepath = Path.Combine(locationpath, "RevitShareParameters.txt");
            if (File.Exists(sharepath))
            {
                File.Delete(sharepath);
            }
            var fa = File.Create(sharepath);
            fa.Close();
            string content = "# This is a Revit shared parameter file.\r\n# Do not edit manually.\r\n*META\tVERSION\tMINVERSION\r\nMETA\t2\t1\r\n*GROUP\tID\tNAME\r\nGROUP\t1\t自定义参数\r\n*PARAM\tGUID\tNAME\tDATATYPE\tDATACATEGORY\tGROUP\tVISIBLE\tDESCRIPTION\tUSERMODIFIABLE\tHIDEWHENNOVALUE\r\nPARAM\tFAE04EC0-301F-11D3-BF4B-00C04F79EFBC\t空间类别\tTEXT\t\t1\t1\t\t1\t0\r\n";
            var strBte = Encoding.UTF8.GetBytes(content);
            File.WriteAllBytes(sharepath, strBte);
            return sharepath;

        }

    }
}
